package com.marktotop.file.exception;

import com.github.tobato.fastdfs.exception.FdfsUnavailableException;
import com.marktotop.file.response.ResultBean;;
import com.marktotop.file.response.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartException;

import javax.servlet.http.HttpServletRequest;


/**
 * 全局异常捕获处理类   -->应该再加上日志
 * @author WXLD
 * @data 2021/4/19 - 17:00
 */
@ControllerAdvice
@Slf4j
@ResponseBody
public class GlobalExceptionHandle {


    /**
     * 捕获自定义的几种异常
     *
     * @param ex
     * @return 异常码和异常信息封装的ResultData对象
     */
    @ExceptionHandler(value = SystemException.class)
    public ResultBean handlerSystemException(Exception ex){

        // 向下转型使SystemException的自定义的不同于父类Exception的方法可以使用
        SystemException systemException = (SystemException)ex;

        // 获得异常码和异常信息
        int errorCode = systemException.getErrorCode();
        String errorMsg = systemException.getErrorMsg();

        // 将异常码和异常信息封装成通用数据返回类型
        ResultBean resultBean = new ResultBean();
        resultBean.setSuccess(false);
        resultBean.setCode(errorCode);
        resultBean.setMessage(errorMsg);

        // 对异常做日志记录，方便项目正式运行时发生异常后寻找异常发生点
        log.error(errorCode + ":" +errorMsg,systemException);

        // 向前端返回数据
        return resultBean;
    }


    /**
     * 上传文件过大，异常处理
     * 可以将Exception中的异常信息以Json的信息返回给前端
     * @return
     */
    @ExceptionHandler(MultipartException.class)
    public ResultBean uploadFileHandle() {
        return ResultBean.result(ResultCode.FILE_SIZE_ERROR);
    }


    /**
     * 上传文件过大，异常处理
     * 可以将Exception中的异常信息以Json的信息返回给前端
     * @return
     */
    @ExceptionHandler(FdfsUnavailableException.class)
    public ResultBean notTrackerServerHandle() {
        return ResultBean.result(ResultCode.NONE_TRACKER_ERROR);
    }


}
